package com.chefu.common.net.file.upload;

import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.Request;
import okhttp3.RequestBody;

/**
 * Created by ${wangshuyun} on 2016/10/27 0027.
 *
 * <p/>
 * 文件上传
 */
public class UploadManager {

    private static UploadManager manager;

    public static final String MULTIPART_FORM_DATA = "image/jpg";
    public static final String FILE_MULTIPART_FORM_DATA = "multipart/form-data";

    private static final int SUCCESS = 1;
    private static final int FAILURE = 2;
    private static final int NET_ERROR = 3;



    public static UploadManager getManager() {
        if (manager != null)
            return manager;

        manager = new UploadManager();
        return manager;
    }

    private UploadManager() {
        init();
    }

    private void init() {
    }


    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch (msg.what) {
                case SUCCESS:
                    break;
                case FAILURE:
                    break;
            }

        }
    };

    /**
     * modify by wangsg
     * 此处封装过于复杂，目前项目没有用到此处封装没经过测试，注释掉防止误解
     * @Date 2017.01.10
     */

//    /**
//     * 上传单个文件 不添加参数
//     *
//     * @param url
//     * @param filePath
//     * @param listener
//     * @param <T>
//     */
//    public <T extends BaseBean> void uploadFile(@NonNull String url, @NonNull Map<String, String> headers,
//                                                @NonNull String partName, @NonNull String filePath,
//                                                final @NonNull Class<T> clazz,
//                                                @NonNull final OnUploadFileListener<T> listener) {
//
//        if (StringUtils.isEmpty(url)) {
//            return;
//        } else if (StringUtils.isEmpty(filePath)) {
//            return;
//        } else if (StringUtils.isEmpty(partName)) {
//            return;
//        }
//
//        File file = new File(filePath);
//
//        RequestBody fileType = RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), file);
//
//        RequestBody requestBody = new MultipartBody.Builder()
//                .setType(MultipartBody.FORM)
//                .addFormDataPart(partName, file.getName(), fileType)
//                .build();
//
//        OkHttpClient client = OkHttp.getUploadFileOkHttpClient();
//
//        Request.Builder builder = new Request.Builder();
//        builder.url(url);
//        builder.post(requestBody);
//
//        if (headers != null && headers.size() != 0) {
//
//            builder.headers(Headers.of(headers));
//        }
//        Request request = builder.build();
//
//        client.newCall(request).enqueue(new Callback() {
//
//            @Override
//            public void onFailure(Call call, IOException e) {
//
//                if (e != null) {
//                    if (listener != null) {
//                        listener.onFailure(e.getMessage());
//                    }
//                }
//            }
//
//            @Override
//            public void onResponse(Call call, Response response) throws IOException {
//
//                if (response != null) {
//
//                    String jsonResult = response.body().string();
//
////                    T t = JSON.parseObject(jsonResult, clazz);
//
//                    T t = JsonUtils.string2JSONObject()
//
//                    if (t != null) {
//                        if (listener != null)
//                            listener.onSuccess(t);
//                    }
//                }
//
//
//            }
//        });
//    }
//
//    /**
//     * 自定义call 上传文件
//     *
//     * @param call
//     * @param listener
//     * @param <T>
//     */
//    public <T extends BaseBean> void uploadFile(@NonNull retrofit2.Call call, @NonNull final OnUploadFileListener<T> listener) {
//
//        if (call == null) {
//            return;
//        }
//
//        //网络检测
//        boolean isNetConnect = AppUtils.checkNetworkStatus(App.getContext());
//
//        if (!isNetConnect) {
//            listener.onNetError();
//            return;
//        }
//
//        call.enqueue(new retrofit2.Callback<T>() {
//            @Override
//            public void onResponse(retrofit2.Call<T> call, retrofit2.Response<T> response) {
//
//                if (response != null) {
//                    T t = response.body();
//
//                    if (t != null) {
//
//                        if (listener != null) {
//                            listener.onSuccess(t);
//                        }
//                    }
//                }
//            }
//
//            @Override
//            public void onFailure(retrofit2.Call<T> call, Throwable t) {
//
//                if (t instanceof HttpException) {
//                    HttpException httpException = (HttpException) t;
//                    //httpException.response().errorBody().string()
//                    int code = httpException.code();
//                    String msg = httpException.getMessage();
//                    if (code == 504) {
//                        msg = "网络不给力";
//
//                        if (listener != null)
//                            listener.onNetError();
//                    }
//                    if (listener != null)
//                        listener.onFailure(msg);
//                } else {
//                    if (listener != null)
//                        listener.onFailure(t.getMessage());
//                }
//
//            }
//        });
//    }
//
//    public void uploadFiles(@NonNull List<String> paths, @NonNull Map<String, String> header,
//                            @NonNull Map<String, String> params, @NonNull String key,
//                            @Nullable OnUploadFileProgressListener onUploadFileProgressListener) {
//
//        //网络检测
//        boolean isNetConnect = AppUtils.checkNetworkStatus(App.getContext());
//
//        if (!isNetConnect) {
//            if (onUploadFileProgressListener != null)
//                onUploadFileProgressListener.onNetError();
//            return;
//        }
//
//        HashMap<String, File> files = new HashMap<>();
//        for (int i = 0; i < paths.size(); i++) {
//            File file = new File(paths.get(i));
//            files.put(file.getName(), file);
//        }
//
//        PostFormRequest postFormRequest = new PostFormRequest(params);
//        postFormRequest.addFiles(key, files);
//
//        RequestBody requestBody;
//        if (onUploadFileProgressListener == null) {
//            requestBody = postFormRequest.buildRequestBody();
//        } else {
//            requestBody = new FileRequestBody(postFormRequest.buildRequestBody(), onUploadFileProgressListener);
//        }
//        Request.Builder builder = new Request.Builder();
//        builder.post(requestBody);
//        appendHeaders(builder, header);
//
//        Request request = builder.build();
//
//        OkHttp.getUploadFileOkHttpClient().newCall(request).enqueue(new Callback() {
//            @Override
//            public void onFailure(Call call, IOException e) {
//
//            }
//
//            @Override
//            public void onResponse(Call call, Response response) throws IOException {
//
//            }
//        });
//
//    }

    /**
     * 获取MultipartBody.Part 对象 针对retrofit 上传文件
     *
     * @param partName
     * @param filePath
     * @return
     */
    public MultipartBody.Part preparserFilePart(@NonNull String partName, @NonNull String filePath) {
        File file = new File(filePath);
        RequestBody requestBody = MultipartBody.create(MediaType.parse(MULTIPART_FORM_DATA), file);
        return MultipartBody.Part.createFormData(partName, file.getName(), requestBody);
    }

    /**
     * 获取MultipartBody.Part 对象 针对retrofit 上传文件
     *
     * @param partName
     * @param filePath
     * @return
     */
    public MultipartBody.Part preparserPart(@NonNull String partName, @NonNull String filePath) {
        File file = new File(filePath);
        RequestBody requestBody = MultipartBody.create(MediaType.parse(FILE_MULTIPART_FORM_DATA), file);
        return MultipartBody.Part.createFormData(partName, file.getName(), requestBody);
    }

    /**
     * 添加请求头
     *
     * @param builder
     * @param headers
     */
    public Request.Builder appendHeaders(Request.Builder builder, Map<String, String> headers) {
        Headers.Builder headerBuilder = new Headers.Builder();
        if (headers == null || headers.isEmpty())
            return null;

        for (String key : headers.keySet()) {
            headerBuilder.add(key, headers.get(key));
        }
        return builder.headers(headerBuilder.build());
    }

    /***
     * 为retrofit 上传文件 拼接参数
     *
     * @param filePath
     * @return
     */
    public Map<String, RequestBody> preparserFileRequest(List<String> filePath) {

        Map<String, RequestBody> map = new HashMap<>();

        for (int i = 0; i < filePath.size(); i++) {
            File file = new File(filePath.get(i));
            map.put("file" + i + "\";filename=\"" + file.getName(),
                    RequestBody.create(MediaType.parse("multipart/form-data"), new File(filePath.get(i))));
        }
        return map;
    }

    /**
     * 为retrofit 上传文件 拼接参数
     * @param file
     * @return
     */
    public Map<String, RequestBody> preparserFileRequest(File file) {

        Map<String, RequestBody> map = new HashMap<>();

        map.put("file" + 1 + "\";filename=\"" + file.getName(),
                RequestBody.create(MediaType.parse("multipart/form-data"), file));
        return map;
    }


}
